// cf-724e
// 题意：
// 给定n(<=10000)个城市的图，每个城市初始有p[i](<=10^9)个单位商品，
// 每个城市最后可以销售s[i](<=10^9)单位个商品，每两个城市(i, j)(i<j)，
// 可以运输一次不超过c单位商品从i到j。问最后整个城市最多可以卖出商品的
// 总量。
//
// 题解：
// 我们可以构建出一个网络流模型，但是这样直接跑的复杂度太高。注意到这是
// 一个dag，我们可以根据最大流最小割定理，来求这个网络的最小割。
// 设dp[l][k]表示1..l的城市选出k个到S集合，剩余到T集合，最小割的容量和。
//
// 那么 dp[l][k]=min(dp[l-1][k-1]+s[i], dp[l-1][k]+c*k+p[i])
//
// 注意边界和坐标范围，dp[0][0]=0, dp[0][i]=inf。
//
// 要用滚动数组，时间复杂度O(n^2)。
//
// ml:run = $bin < input
#include <iostream>
#include <algorithm>

using ll = long long;
ll const inf = (1ll) << 50;
int const maxn = 10007;
ll p[maxn], s[maxn];
ll dp[2][maxn];
ll n, c;

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin >> n >> c;
    for (int i = 1; i <= n; i++) std::cin >> p[i];
    for (int i = 1; i <= n; i++) std::cin >> s[i];
    int now = 0, prev = 1;
    dp[now][0] = 0;
    for (int i = 1; i <= n; i++) dp[now][i] = inf;
    for (int i = 1; i <= n; i++) {
        std::swap(now, prev);
        dp[now][0] = dp[prev][0] + p[i];
        for (int j = 1; j <= i; j++) {
            dp[now][j] = dp[prev][j - 1] + s[i];
            if (j <= i - 1)
                dp[now][j] = std::min(dp[now][j], dp[prev][j] + c * j + p[i]);
        }
    }
    ll ans = dp[now][0];
    for (int i = 1; i <= n; i++) ans = std::min(ans, dp[now][i]);
    std::cout << ans << "\n";
}

